package com.smbms.controller;


import com.alibaba.fastjson.JSON;
import com.smbms.pojo.Role;
import com.smbms.pojo.User;
import com.smbms.servlet.UserService;
import com.smbms.util.PageBean;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.naming.NoPermissionException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.*;

@Controller
@RequestMapping("/user")
public class UserController {
    Logger logger = Logger.getLogger(UserController.class);

    @Resource
    private UserService userService;

    @RequestMapping("/delete/{userId}")
    @ResponseBody //不加responseBody 走的是请求转发 加responseBody 走的是ajax，值返回数据到当前页面
    public String deleteUserById(@PathVariable Integer userId){
        Map<String,Object> map = new HashMap<String,Object>();
        int row = userService.deleteUserById(userId);
        if(row > 0){
            map.put("delResult","true");
        }else if(row == 0){
            map.put("delResult","notexist");
        }else {
            map.put("delResult","false");
        }
        return JSON.toJSONString(map);
    }

    @RequestMapping("/modifyUser")
    public String modifyUser(HttpSession session,@ModelAttribute User user){
        /*因为修改时间和修改用户需要更新，所以需要通过session获取当前用户*/
        User loginUser = (User)session.getAttribute("loginUser");
        user.setModifyBy(loginUser.getId());
        user.setModifyDate(new Date());
        boolean result = userService.modifyUser(user);
        if(result){
            return "redirect:/user/userlist";
        }else {
            return "usermodify";
        }
    }

    @RequestMapping("/toModify/{userid}")
    public String toMadify(HttpServletRequest request,@PathVariable Integer userid){
            User user =  userService.getUser(userid);
        request.setAttribute("user",user);
        return "usermodify";
    }

    @RequestMapping("/view/{userid}")
    public String userView(HttpServletRequest request,@PathVariable Integer userid){
        User user =  userService.getUser(userid);
        if(user != null){
            request.setAttribute("user",user);
            return "userview";
        }else {
            return "redirect:/user/userlist";
        }
    }



    /*做文件上传，树妖接受前端的请求发送过来的enctype类型的name属性*/
    @RequestMapping("/useraddsave")
    public String userAddSave(HttpSession session,HttpServletRequest request,@RequestParam(value = "a_idPicPath",required = false) MultipartFile multipartFile,User user){

        /*提升一下绝对路径的作用域*/
        String fileUpLoadPath ="";
        /*定义一个属性，接受文件超出的信息*/
        String idPicPathError = "";
        /*提升一下文件名的作用域*/
        String newFileName ="";
        /*1.获取MultipartFile对象并判断上传的文件是否为空*/
        if(multipartFile != null ){
            /*如果为空说明没有上传文件，接下来就要进行文件上传准备工作*/
            /*1.1,准备文件上传的路径，文件上传到哪里*/
            /*首先获取绝对路径*/   /*File.separator：目的是为了获取分隔符，"/",在不同系统上可以自适应*/
            fileUpLoadPath = session.getServletContext().getRealPath("statics"+File.separator+"uploadFiles");
           logger.info(fileUpLoadPath);
           /*1.2,获取文件名*/
           String filrName = multipartFile.getOriginalFilename();
//           /*1.3获取获取文件的大小*//*multipartFile.getSize()获取文件大小方法*/
            /*获取之后直接去判断，如果不符合最大限制，就注解返回页面*/
            if(multipartFile.getSize() > 5000000){
                idPicPathError = "上传的文件超出限制!!!";
                request.setAttribute("idPicPathError",idPicPathError);
                return  "useradd";
            }
            /*如果符合大小，就定义要上传的文件名*/
            /*首先获取文件后缀名，然后去判断文件后缀名是否符合上传标准*/
            /*截取文件后缀名*/
            String suffix = filrName.substring(filrName.indexOf(".")+1);
            /*截取文件前缀*//*从第一个开始，到.结束*/
            String prefix = filrName.substring(0,filrName.indexOf("."));
            /*得到文件前缀和后缀之后*/
            /*定义一个集合来规定上传图片格式*/
            List<String> list = new ArrayList<String>();
            list.add("jpg");
            list.add("jpeg");
            list.add("png");
            /*判断是否符合文件格式*/ /*list.contains(suffix)这个方法可以直接判断list中存不存在这个格式的后缀*/
            if(!list.contains(suffix)){
                request.setAttribute("idPicPathError","文件格式不支持！！请上传jpg jpeg png以上格式的文件");
                return "useradd";
            }
            /*为了防止每次上传的文件名冲突，我们在这里生成随机数来控制冲突现象*/
            newFileName = prefix+(int)(Math.random()*(100000-10000)+10000)+""+System.currentTimeMillis()+"."+suffix;
            /*开始文件上传*/ /*multipartFile.transferTo();这个方法可以将接收到的文件复制并移动到指定位置，如果目标文件已存在。首先会删除，所以要通过File定义一个地址，告诉它要给我们一定到什么地方,在什么地方去找什么文件，所以要传入文件名和保存路径*/
            File file = new File(fileUpLoadPath,newFileName);
            /*做一个判断，判断目标路径是否存在当前文件*/
            if (!file.exists()){
                /*如果文件不存在，就调用file.mkdir()这个方法创建一个新文件夹*/ /*file.exists()判断文件是否存在的方法*/
                file.mkdirs();//创建文件夹
            }
            /*如果存在，就真的可以开始文件上传操作*/
            try {
                multipartFile.transferTo(file);
            } catch (IOException e) {
                e.printStackTrace();
                request.setAttribute("idPicPathError","系统错误,请重试");
                return "useradd";
            }


        }
        /*如果不为空，就直接添加数据*/
        /*添加一个创建时间属性*/
        user.setCreationDate(new Date());
        /*通过session获取到当前添加用户的操作者id*/
        User loginUser = (User)session.getAttribute("loginUser");
        user.setCreatedBy(loginUser.getId());
        /*文件的判断如果都成功，接下来需要吧文件的路径上传到数据库,因为这里是利用实体类传参，在这就需要吧文件的路径赋值到实体类中文件的属性上*/
        user.setIdPicPath(File.separator+"statics"+File.separator+"uploadFiles"+File.separator+newFileName);
        boolean resout = userService.userAddSave(user);
        if(resout){
            return "redirect:/user/userlist";
        }
        return "useradd";
    }


    /*@PathVariable这个注解就是来接受路径上的参数*/
    @RequestMapping("/userCodeIsExists/{userCode}")
    @ResponseBody
    public String userCodeIsExists(@PathVariable String userCode){
        Map<String,Object> map = new HashMap<String,Object>();
        /*根据usercode查询user对象*/
        User user = userService.checkUserCode(userCode);
        if(user != null){
            map.put("userCode","exist");
        }else {
            map.put("userCode","noexist");
        }
        return JSON.toJSONString(map);
    }

    /*如果说是ajax请求，请记住如下注解*/
    /*ajax请求不会请求转发，直接返回请求就可以接受数据 */
    /*/*,produces = "applocation/json;charset=utf-8":每次请求都需要配置*/
    @RequestMapping("/getRoleList")
    @ResponseBody
    public String getRoleList(){
        List<Role> roleList = userService.getRoleList();
        //因为返回值是要json 所以要把返回值准成json
        return JSON.toJSONString(roleList);
    }

    @RequestMapping("/touseradd")
    public String touseradd(){
        return "useradd";
    }

    @RequestMapping("/userlist")
    public String userList(@RequestParam(defaultValue = "1") Integer pageIndex, HttpServletRequest request, String queryname, Integer queryUserRole){
        //起始页

        //设置每页显示多少条数据
        int pageSize = 5;
        /*参数过多，这里用map接受参数*/
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("index",pageIndex);
        map.put("pagesize",pageSize);
        map.put("queryname",queryname);
        map.put("queryUserRole",queryUserRole);
        PageBean<User> page = userService.getPage(map);
        //查询角色列表
        List<Role> roleList = userService.getRoleList();
        request.setAttribute("roleList",roleList);
        request.setAttribute("page",page);

        /*条件查询框回显*/
        request.setAttribute("queryUserName",queryname);
        request.setAttribute("queryUserRole",queryUserRole);
        return "userlist";
    }


    @RequestMapping("/logout")
    public String logout(HttpSession session){
       User loginUser = (User)session.getAttribute("loginUser");
       session.removeAttribute("loginUser");
       return "login";
    }

    @RequestMapping("/login")
    public String login(HttpSession session) throws NoPermissionException{
       User loginUser =  (User)session.getAttribute("loginUser");
       if(loginUser == null){
            throw new NoPermissionException("对不起，你没有登陆,几秒后跳转到登陆界面!");
       }
        return "frame";
    }


    @RequestMapping("/dologin")
    public String doLogin(HttpServletRequest request, String userCode, String userPassword) {
        if (userCode != null && userPassword != null) {
            User user = userService.login(userCode, userPassword);
            if (user == null) {
                request.setAttribute("error", "用户名或者用户密码错误");
                return "login";
            }
            request.getSession().setAttribute("loginUser", user);
            return "redirect:/user/login";
        } else {
            request.setAttribute("error", "用户名或者用户密码不能为空");
            return "login";
        }
    }
}